desc:DDR Ducker
//
//    V0.1 24.09.2021 Start Project
//    Belov Vladimir
//

slider1:0<0,1,1{Self,SideChain}>Detect
slider3:-18<-40,0,0.01>Treshold
slider4:3<3,20,0.01>Range
//slider4:0<0,10,1>-Knee
slider6:50<0.01,100,0.01>Attack
slider7:50<10,250,1>Hold
slider8:200<10,1000,0.01>Release

@init
gr_meter=1;
gr_mete2=1; 
dec=20/03/30;

@slider
T=slider3;
Range=slider4;
slider1 == 0 ? (det0=1; det1=0);
slider1 == 1 ? (det0=0; det1=1);

aa=1-exp(-log(9)*1000/srate/slider6);
ar=1-exp(-log(9)*1000/srate/slider8);
Cmax=srate*slider7/1000;

@block


@sample

in=max(abs(spl0*det0 + spl2*det1),abs(spl1*det0 + spl3*det1)); // Detecet IN

indb=20*log10(in);
indb<T ? insc=indb;
 
indb>=T ? insc=indb-Range;

g=insc-indb;

g<g0 ? (
        g=g0 - aa*(g0 - g); c=0
       ): (
        g=g0 - (c>Cmax)*ar*(g0-g) ; c=c+1 
       );
g0=g;
a=(c>Cmax);

spl0=spl0*10^(g/20);
spl1=spl1*10^(g/20);


@gfx 0 32 // request horizontal/vertical heights (0 means dont care)

  gr<g      ? gr+=dec;
  gr>g+dec  ? gr-=dec;
  
  gr_mete2=10^(gr/20);
/*  gr_meter=min(10^(g/20),gr_meter);
  gr_meter *= exp(1/60); gr_meter>1 ? gr_meter=1; // decay meter here so if the audio processing stops it doesnt "stick"
*/
  gr_meter=10^(g/20);
  gfx_r=1; gfx_g=gfx_b=0; gfx_a=0.8;
  
  meter_bot=20;
  meter_h=min(gfx_h,32);
  xscale=gfx_w*20/meter_bot;

  gfx_y=0;
  gfx_x=gfx_w + log10(gr_meter)*xscale;
  gfx_rectto(gfx_w,meter_h/2);

  gfx_y=0+meter_h/2+1;
  gfx_x=gfx_w + log10(gr_mete2)*xscale;
  gfx_rectto(gfx_w,meter_h);
  
  gfx_r=gfx_g=gfx_b=1.0; gfx_a=0.6;

  s2=sqrt(2)/2;
  gg = s2;
  while(
    gfx_x=gfx_w + log10(gg)*xscale;
    gfx_x >= 0 ? 
    (
      gfx_y=0;
      gfx_lineto(gfx_x,meter_h,0);
      gfx_y=meter_h-gfx_texth;
      gfx_x+=2;
      gfx_drawnumber(log10(gg)*20,0);
      gfx_drawchar($'d');
      gfx_drawchar($'B');
    );
    gg*=s2;
    gfx_x >=0;
  );
  gfx_a=1;

  gfx_x=0; gfx_y=meter_h/2 - gfx_texth/2;
  gfx_drawnumber(log10(gr_meter)*20,1);
  gfx_drawchar($'d');
  gfx_drawchar($'B');
